#!/bin/sh
#
# openvswitch
#
# chkconfig: 2345 09 91
# description: Manage Open vSwitch kernel modules and user-space daemons

# Copyright (C) 2009, 2010, 2011 Nicira, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
### BEGIN INIT INFO
# Provides:          openvswitch-switch
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Open vSwitch switch
### END INIT INFO

. /usr/share/openvswitch/scripts/ovs-lib || exit 1
. /etc/xensource-inventory
test -e /etc/sysconfig/openvswitch && . /etc/sysconfig/openvswitch

case `cat /etc/xensource/network.conf` in
    vswitch|openvswitch)
        ;;
    bridge)
        exit 0
        ;;
    *)
        echo "Open vSwitch disabled (/etc/xensource/network.conf is invalid)" >&2
        exit 0
        ;;
esac

start_ovs_xapi_sync () {
    if daemon_is_running ovs-xapi-sync; then
	log_success_msg "ovs-xapi-sync is already running"
    else
	PYTHONPATH=/usr/share/openvswitch/python \
            /usr/share/openvswitch/scripts/ovs-xapi-sync \
            --log-file --pidfile --detach --monitor unix:/var/run/openvswitch/db.sock
    fi
}

start () {
    set ovs_ctl ${1-start}
    set "$@" --system-id="$INSTALLATION_UUID"
    set "$@" --system-type="$PRODUCT_BRAND"
    set "$@" --system-version="$PRODUCT_VERSION-$BUILD_NUMBER"
    set "$@" --external-id=xs-system-uuid="$INSTALLATION_UUID"
    set "$@" --daemon-cwd=/var/xen/openvswitch
    if test X"$FORCE_COREFILES" != X; then
	set "$@" --force-corefiles="$FORCE_COREFILES"
    fi
    if test X"$OVSDB_SERVER_PRIORITY" != X; then
	set "$@" --ovsdb-server-priority="$OVSDB_SERVER_PRIORITY"
    fi
    if test X"$VSWITCHD_PRIORITY" != X; then
	set "$@" --ovs-vswitchd-priority="$VSWITCHD_PRIORITY"
    fi
    if test X"$VSWITCHD_MLOCKALL" != X; then
	set "$@" --mlockall="$VSWITCHD_MLOCKALL"
    fi
    if test ! -e /var/run/openvswitch.booted; then
        touch /var/run/openvswitch.booted
        set "$@" --delete-bridges
    fi
    set "$@" $OVS_CTL_OPTS
    "$@"

    start_ovs_xapi_sync

    ovs_ctl --protocol=gre enable-protocol

    touch /var/lock/subsys/openvswitch
}

force_reload_kmod () {
    start force-reload-kmod

    # Restart the high-availability daemon if it is running.  Otherwise
    # it loses its heartbeat and reboots the system after a few minutes.
    if pidof xhad >/dev/null && test -e /etc/xensource/xhad.conf; then
	PATH=$PATH:/opt/xensource/xha
	action "Stopping HA daemon" ha_stop_daemon
	action "Starting HA daemon" ha_start_daemon
    fi

    action "Stopping ovs-xapi-sync" stop_daemon ovs-xapi-sync
    action "Starting ovs-xapi-sync" start_ovs_xapi_sync
}

stop () {
    ovs_ctl stop
    stop_daemon ovs-xapi-sync
    rm -f /var/lock/subsys/openvswitch
}

restart () {
    if [ "$1" = "--save-flows=yes" ]; then
        stop_daemon ovs-xapi-sync
        start restart
    else
        stop
        start
    fi
}

case $1 in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        shift
        restart "$@"
        ;;
    reload|force-reload)
        # The main OVS daemons keep up-to-date, but ovs-xapi-sync needs help.
        if daemon_is_running ovs-xapi-sync; then
            action "Configuring Open vSwitch external IDs" \
                ovs-appctl -t ovs-xapi-sync flush-cache
        fi
        ;;
    status)
        ovs_ctl status && daemon_status ovs-xapi-sync
        ;;
    version)
        ovs_ctl version
        ;;
    force-reload-kmod)
        force_reload_kmod
        ;;
    help)
        printf "openvswitch [start|stop|restart|reload|force-reload|status|version]\n"
        ;;
    *)
        printf "Unknown command: $1\n"
        exit 1
        ;;
esac
